#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
主题管理器
统一管理应用程序的主题切换
"""

from PyQt5.QtWidgets import QApplication, QActionGroup
from PyQt5.QtGui import QPalette, QColor
from PyQt5.QtCore import QObject, pyqtSignal


class ThemeManager(QObject):
    """主题管理器 - 统一管理UI主题"""
    
    # 主题切换信号
    theme_changed = pyqtSignal(str)  # 发射主题名称
    
    # 预定义主题配置
    THEMES = {
        'dark': {
            'name': '暗色主题',
            'palette': {
                'window': '#2b2b2b',
                'windowText': '#ffffff',
                'base': '#1e1e1e',
                'alternateBase': '#353535',
                'toolTipBase': '#ffffff',
                'toolTipText': '#ffffff',
                'text': '#ffffff',
                'button': '#353535',
                'buttonText': '#ffffff',
                'brightText': '#ff0000',
                'link': '#1890ff',
                'highlight': '#0078d4',
                'highlightedText': '#ffffff',
                'disabled_text': '#666666',
                'disabled_buttonText': '#666666'
            },
            'qss': {
                'background': '#2b2b2b',
                'foreground': '#ffffff',
                'hover': '#3d3d3d',
                'pressed': '#1e1e1e',
                'border': '#555555',
                'accent': '#0078d4'
            }
        },
        'light': {
            'name': '亮色主题',
            'palette': {
                'window': '#f0f0f0',
                'windowText': '#000000',
                'base': '#ffffff',
                'alternateBase': '#f5f5f5',
                'toolTipBase': '#ffffdc',
                'toolTipText': '#000000',
                'text': '#000000',
                'button': '#e0e0e0',
                'buttonText': '#000000',
                'brightText': '#ffffff',
                'link': '#0078d4',
                'highlight': '#0078d4',
                'highlightedText': '#ffffff',
                'disabled_text': '#999999',
                'disabled_buttonText': '#999999'
            },
            'qss': {
                'background': '#f0f0f0',
                'foreground': '#000000',
                'hover': '#e0e0e0',
                'pressed': '#d0d0d0',
                'border': '#c0c0c0',
                'accent': '#0078d4'
            }
        }
    }
    
    def __init__(self, app=None, icon_manager=None):
        """
        初始化主题管理器
        
        Args:
            app: QApplication实例
            icon_manager: IconManager实例
        """
        super().__init__()
        self.app = app or QApplication.instance()
        self.icon_manager = icon_manager
        self.current_theme = 'dark'
        self.action_group = None  # 主题菜单的互斥组
        self.parser = None  # XML解析器引用（用于更新图标）
    
    def set_theme(self, theme_name):
        """
        设置主题
        
        Args:
            theme_name: 主题名称 ('dark' 或 'light')
        """
        if theme_name not in self.THEMES:
            print(f"未知主题: {theme_name}")
            return
        
        if theme_name == self.current_theme:
            return
        
        print(f"切换主题: {self.current_theme} -> {theme_name}")
        
        # 冻结所有顶层窗口的UI更新
        if self.app:
            for widget in self.app.topLevelWidgets():
                widget.setUpdatesEnabled(False)
        
        # 1. 应用调色板
        self._apply_palette(theme_name)
        
        # 2. 更新图标主题
        if self.icon_manager:
            self.icon_manager.set_theme(theme_name)
        
        # 2.5. 重新加载所有action的图标
        self._reload_action_icons()
        
        # 3. 应用QSS样式
        self._apply_stylesheet(theme_name)
        
        # 更新当前主题
        old_theme = self.current_theme
        self.current_theme = theme_name
        
        # 解冻所有顶层窗口的UI更新
        if self.app:
            for widget in self.app.topLevelWidgets():
                widget.setUpdatesEnabled(True)
                widget.update()
        
        # 发射主题切换信号
        self.theme_changed.emit(theme_name)
        
        print(f"主题切换完成: {theme_name}")
    
    def _apply_palette(self, theme_name):
        """应用调色板"""
        if not self.app:
            return
        
        theme = self.THEMES[theme_name]
        palette_config = theme['palette']
        
        palette = QPalette()
        
        # 设置各个调色板角色
        palette.setColor(QPalette.Window, QColor(palette_config['window']))
        palette.setColor(QPalette.WindowText, QColor(palette_config['windowText']))
        palette.setColor(QPalette.Base, QColor(palette_config['base']))
        palette.setColor(QPalette.AlternateBase, QColor(palette_config['alternateBase']))
        palette.setColor(QPalette.ToolTipBase, QColor(palette_config['toolTipBase']))
        palette.setColor(QPalette.ToolTipText, QColor(palette_config['toolTipText']))
        palette.setColor(QPalette.Text, QColor(palette_config['text']))
        palette.setColor(QPalette.Button, QColor(palette_config['button']))
        palette.setColor(QPalette.ButtonText, QColor(palette_config['buttonText']))
        palette.setColor(QPalette.BrightText, QColor(palette_config['brightText']))
        palette.setColor(QPalette.Link, QColor(palette_config['link']))
        palette.setColor(QPalette.Highlight, QColor(palette_config['highlight']))
        palette.setColor(QPalette.HighlightedText, QColor(palette_config['highlightedText']))
        
        # 禁用状态
        palette.setColor(QPalette.Disabled, QPalette.Text, QColor(palette_config['disabled_text']))
        palette.setColor(QPalette.Disabled, QPalette.ButtonText, QColor(palette_config['disabled_buttonText']))
        
        self.app.setPalette(palette)
    
    def _apply_stylesheet(self, theme_name):
        """应用全局样式表"""
        if not self.app:
            return
        
        theme = self.THEMES[theme_name]
        qss_config = theme['qss']
        
        # 生成全局QSS
        qss = f"""
        QMainWindow {{
            background-color: {qss_config['background']};
        }}
        
        QMenuBar {{
            background-color: {qss_config['background']};
            color: {qss_config['foreground']};
            border-bottom: 1px solid {qss_config['border']};
        }}
        
        QMenuBar::item:selected {{
            background-color: {qss_config['hover']};
        }}
        
        QMenu {{
            background-color: {qss_config['background']};
            color: {qss_config['foreground']};
            border: 1px solid {qss_config['border']};
        }}
        
        QMenu::item:selected {{
            background-color: {qss_config['hover']};
        }}
        
        QStatusBar {{
            background-color: {qss_config['background']};
            color: {qss_config['foreground']};
        }}
        """
        
        self.app.setStyleSheet(qss)
    
    def get_current_theme(self):
        """获取当前主题名称"""
        return self.current_theme
    
    def get_theme_list(self):
        """获取所有可用主题"""
        return list(self.THEMES.keys())
    
    def set_parser(self, parser):
        """
        设置XML解析器引用
        
        Args:
            parser: MenuToolbarParser实例
        """
        self.parser = parser
    
    def _reload_action_icons(self):
        """
        重新加载所有action的图标
        主题切换后调用，使图标颜色跟随主题变化
        """
        if not self.parser or not self.icon_manager:
            return
        
        # 遍历所有已创建的action
        for action_id, action in self.parser.actions.items():
            # 从XML中获取原始图标名称
            icon_name = getattr(action, '_icon_name', None)
            if icon_name:
                # 重新加载图标（使用新主题的颜色）
                new_icon = self.icon_manager.get_icon(icon_name)
                action.setIcon(new_icon)
    
    def create_theme_action_group(self, actions_dict):
        """
        创建主题切换的互斥动作组
        
        Args:
            actions_dict: {theme_name: QAction} 字典
        """
        if not actions_dict:
            return
        
        self.action_group = QActionGroup(self)
        self.action_group.setExclusive(True)
        
        for theme_name, action in actions_dict.items():
            self.action_group.addAction(action)
            
            # 设置当前主题为选中状态
            if theme_name.replace('theme_', '') == self.current_theme:
                action.setChecked(True)


# 全局主题管理器实例
_global_theme_manager = None


def get_theme_manager(app=None, icon_manager=None):
    """获取全局主题管理器实例"""
    global _global_theme_manager
    
    if _global_theme_manager is None:
        _global_theme_manager = ThemeManager(app, icon_manager)
    
    return _global_theme_manager


def set_theme(theme_name):
    """设置全局主题"""
    global _global_theme_manager
    
    if _global_theme_manager:
        _global_theme_manager.set_theme(theme_name)
    else:
        print("主题管理器未初始化")
